// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/compositor/layer_animator_collection.h"

#include <set>

#include "base/time/time.h"
#include "ui/compositor/compositor.h"
#include "ui/compositor/layer_animator.h"

namespace ui {

LayerAnimatorCollection::LayerAnimatorCollection(Compositor* compositor)
    : compositor_(compositor)
    , last_tick_time_(base::TimeTicks::Now())
{
}

LayerAnimatorCollection::~LayerAnimatorCollection()
{
    if (compositor_)
        compositor_->RemoveAnimationObserver(this);
}

void LayerAnimatorCollection::StartAnimator(
    scoped_refptr<LayerAnimator> animator)
{
    DCHECK_EQ(0U, animators_.count(animator));
    if (!animators_.size())
        last_tick_time_ = base::TimeTicks::Now();
    animators_.insert(animator);
    if (animators_.size() == 1U && compositor_)
        compositor_->AddAnimationObserver(this);
}

void LayerAnimatorCollection::StopAnimator(
    scoped_refptr<LayerAnimator> animator)
{
    DCHECK_GT(animators_.count(animator), 0U);
    animators_.erase(animator);
    if (animators_.empty() && compositor_)
        compositor_->RemoveAnimationObserver(this);
}

bool LayerAnimatorCollection::HasActiveAnimators() const
{
    return !animators_.empty();
}

void LayerAnimatorCollection::OnAnimationStep(base::TimeTicks now)
{
    last_tick_time_ = now;
    std::set<scoped_refptr<LayerAnimator>> list = animators_;
    for (std::set<scoped_refptr<LayerAnimator>>::iterator iter = list.begin();
         iter != list.end();
         ++iter) {
        // Make sure the animator is still valid.
        if (animators_.count(*iter) > 0)
            (*iter)->Step(now);
    }
    if (!HasActiveAnimators() && compositor_)
        compositor_->RemoveAnimationObserver(this);
}

void LayerAnimatorCollection::OnCompositingShuttingDown(
    Compositor* compositor)
{
    DCHECK_EQ(compositor_, compositor);
    compositor_->RemoveAnimationObserver(this);
    compositor_ = nullptr;
}

} // namespace ui
